perm filename BOLD2[F8,ALS] blob
sn#329609 filedate 1978-01-26 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00024 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 *Black-and-Blue as of January 25 1978
C00009 00003 * ORG H'1000' QN1
C00014 00004 * BRDA Byte # Initial board in SC
C00018 00005 * PMOV MES1 CUR1 WMC
C00023 00006 * WMCA DATA FOR WMC
C00030 00007 * BORD MEN Generate board image and introduce men
C00035 00008 * BLKP BLUP WAST BDAT SEDC TABL
C00038 00009 * CURS
C00046 00010 * MVC AMAP BLNK
C00052 00011 * INIT TY0 AMP BLNK UDIT YMF SKL
C00057 00012 * MWAD RASC SCRA SCRD
C00062 00013 * INHR
C00067 00014 * STOP at end of game
C00073 00015 * FLSH
C00077 00016 * SELE FLIP FORE
C00082 00017 * FORE
C00088 00018 * MSUB Subroutine to locate all plays in specified byte
C00094 00019 * NEXT PFND FIND
C00102 00020 * AFT No more plays found so time to back up
C00106 00021 EV6VAZ EVAL
C00111 00022 * SHOW ADTB SEE
C00116 00023 * TUN2 TUN1 END
C00119 00024 * Storage map
C00124 ENDMK
C⊗;
*Black-and-Blue as of January 25 1978
*Resident package addresses
JOYT EQU H'0C00'
LINE EQU H'0FDF'
SHCB EQU H'0FE2'
INPF EQU H'0FE3'
WTLN EQU H'0FE5'
TXC EQU H'0FE8'
CMRG EQU H'0FEA'
DBNC EQU H'0FEB'
UPI EQU H'0FFA'
JOYI EQU H'21AD'
IJS EQU H'22DB'
SHL EQU H'27C6'
SHR EQU H'27D3'
PUSH EQU H'40A9'
POPS EQU H'40BC'
SPS EQU H'40D0'
WC EQU H'40D9'
WDG EQU H'4105'
WAUD EQU H'41C8'
WAU1 EQU H'41CC'
CDS EQU H'41D5'
WMS EQU H'4205'
UDAT EQU H'424D'
TRAN EQU H'43CD'
FCS EQU H'43D6'
WAIT EQU H'4501'
TIR EQU H'45DB'
SNE EQU H'46D6'
CLER EQU H'4762'
*Misc. constants
TCMD EQU H'44'
BCMD EQU H'6D'
TCOL EQU H'80' TEXT COLOR
ULIN EQU H'FA'
COM EQU H'8F7'
*RAM assignments
BFLG EQU H'0C20' BUTTON EDGE FLAG
BLNF EQU H'0C21' Blink flag
XBLN EQU H'0C22' X value to blink
YBLN EQU H'0C23' Y value to blink
BCNT EQU H'0C24' Counter used in OKMV
BKMV EQU H'0C25' Data to index book moves
HSAV EQU H'0C26' H save location
PLY0 EQU H'0C28' Place for player's ply depth choice
SFLG EQU H'0C29' SELE vs FIND flag (0 if FIND)
PNUM EQU H'0C2A' Play number
ESAV EQU H'0C2C' Temporary save of BY and EMPTY byte
FFLG EQU H'0C2D' FIND ROUTINE FLAG
CVS EQU H'0C2E' CV save location
BSAV EQU H'0C2F' BY save location
OBJ0 EQU H'0C30' Board 1, thru H'0E0F'
TREE EQU H'0E10' Tree data, thru H'0EFF', Player's board f
TRE2 EQU H'0E20' Machine's first board here
PLMV EQU H'0ED0' Overlay region used for player's moves
DNUM EQU H'0EE0' Depth numbers (allows for passed boards)
PLAY EQU H'0EF0' BYTE and # (14 2 BYTE PAIRS)
XPOS EQU H'0F0C' XPOSITION(CURSOR)
YPOS EQU H'0F0F' YPOSITION(CURSOR)
OBJ1 EQU H'0F10' Board 2, thru H'0FAF'
SCRE EQU H'0FB0' Score reference with off-set
SCOR EQU H'0FB1' Score
RGSV EQU H'0FC8' Register save start (int. update)
* Register assignment
SN EQU H'0' Score number
BN EQU H'1' Byte number
DR EQU H'2' Direction
BY EQU H'3' Byte
FB EQU H'4' F or B number
RL EQU H'5' R or L number
CV EQU H'6' Count along string
SIDE EQU H'7' Side that is active (0 1f black)
TEMP EQU H'8'
J EQU H'9'
HU EQU H'A'
HL EQU H'B'
ALOC EQU O'3' LISU value for ACTIVE pieces
PLOC EQU O'4' LISU value for PASSIVE pieces
ISA EQU O'30' ISAR value for active area
ISP EQU O'40' ISAR value for passive
* Ply depths
PLYA EQU H'3' Playing depth for ABE
PLYB EQU H'5' Playing depth for BETTY
PLYC EQU H'7' Playing depth for CHARLIE
PLYD EQU H'9' Playing depth for DOROTHY
*SPECIAL CONSTANTS
MSK EQU H'1' X ZOOM BIT MASK (CMRG)
X EQU H'1'
Y EQU H'2'
VX EQU H'3'
VY EQU H'4'
CHT EQU H'3' CURSOR HEIGHT
YTST EQU H'9'
XZOP EQU H'34' LINE FOR RESTORE OF X ZOOM
MAXY EQU H'4D' MAX Y COORD (=H'4F'-CHT)
* ORG H'1000' QN1
ORG H'1000' Initial operations and questions
DC H'AA'
DC H'55'
DC H'01' BACKGROUND COLOR
DC H'00'
DC H'2D27' BL
DC H'1131' AC
DC H'1500' K-
DC H'112B' AN
DC H'1F00' D-
DC H'2D27' BL
DC H'030B' UE
*-*-
DCI H'8F5'
CLR
ST SET BACKGROUND BLACK
PI CDS CLEAR DISPLAY
PI IJS INITIALIZE JOYSTICK TABLE
LISU 2 For safety only, can be removed later
LISL 6
CLR
XS S
BM QN1 Is clock running?
LI H'81' No, so start it
LR D,A
LIS 2
LR S,A
*-*-*-*- Initial question session
QN1 LIS H'5'
LR 0,A
PI SEDC SET MESSAGE LNGTH&LINE POINTER
DCI SKL
PI WMS WRITE MESSAGE
PI RKB AND DO KEYBOARD READ
CI H'2D'
BZ QN10 Is it Betty?
CI H'31' NO.
BZ QN9 Is it Charlie?
CI H'1F'
BZ QN8 Is it Dorothy
LI PLYA Then it's Abe
BR QN11
QN8 LI PLYD It's Dorothy
BR QN11
QN9 LI PLYC It's Charlie
BR QN11
QN10 LI PLYB It's Betty
QN11 DCI PLY0
ST AND SAVE IT.
DS 0
DS 0
DS 0 SET FOR BUT TWO LINES
PI CDS CLEAR DISPLAY
PI SEDC SET LINE POINTER
LIS H'5'
COM
AS S
LR S,A SET FOR BUT H'1A' LENGTH
DCI YMF DCO TO MESSAGE START
PI WMS SO WRITE MESSAGE
PI RKB READ KEYBOARD
CI H'2B' Is answer an N?
CLR
BZ QN13 0 in 7 means machine's play
COM -1 means player's play
QN13 LR 7,A
QN14 DCI FSTP Table of first plays
XDC
DCI PLMV List to verify plays
LIS H'9'
LISU 2
LISL 0
LR S,A SET TRANSFER COUNT
PI TRAN DO TRANSFER
DCI BKMV
CLR
ST Clear Book move index value
DCI CMRG
LI H'65'
ST SET FOR X & Y ZOOM
PI CLER CLER UM1 REGISTERS
DCI UPI DCO TO UPDATE CONTROLS
LIS H'3'
ST SET INTO COUNT
CLR
ST SET FOR FULL INIT
LI INIT:
ST
LI INIT.
ST AND SET ADDRESS
PI WAUD WAIT, THEN UPDATE
LIS H'5'
LR S,A GET TRANSFER COUNT
DCI BDAT SET SOURCE
XDC INTO DC1
DCI UPI+1 DESTINATION
PI TRAN TRANSFER DATA
PI WAUD WAIT, DO UPDATE, RESET ISAR&RET.
PI ENIN NOW ENABLE INTERRUPT
* BRDA Byte # Initial board in SC
* Load SC _________________________________
LISU ALOC 0 |___|___|___|___|___|___|___|___|
LISL 7 1 |___|___|___|___|___|___|___|___|
CLR Clear area 2 |___|___|___|___|___|___|___|___|
BRDA LR D,A 3 |___|___|___|_A_|_P_|___|___|___|
BR7 BRDA 4 |___|___|___|_P_|_A_|___|___|___|
LISU PLOC 5 |___|___|___|___|___|___|___|___|
LISL 7 6 |___|___|___|___|___|___|___|___|
BRDP LR D,A 7 |___|___|___|___|___|___|___|___|
BR7 BRDP 80 40 20 10 8 4 2 1
LISU ALOC Byte value
LISL 3
LIS H'1'
SL 4
LR I,A Put H'10' into A row 3
LISU PLOC
LR D,A Put H'10' into P row 4
LIS H'8'
LR I,A Put H'08' into P row 3
LISU ALOC
LR S,A Put H'08' into A row 4
DCI TREE
LR H,DC
PI SCRD SR to RAM for player's first move
PI BORD Generate board image with men
DCI XPOS
LIS H'0'
ST SET FOR LEFT MOST
LIS H'3'
ST
LIS H'0'
ST
DCI YPOS
ST AND SET FOR TOPMOST
*-*- Start play
DCI PNUM
CLR
ST Reset play number
XS 7
BM PMOV Player to play first
*-*- Machine to play first
DCI PLAY+2 Store data here
XDC
LISU 2 Get random number
LISL 5
LIS H'3'
NS S Save last 2 bits
SL 1 2 bytes per entry
DCI FSTP
ADC
LM
XDC
ST
XDC
LM
XDC
ST
DCI TRE2 Machine's board goes here
LR H,DC
PI SCRD SR to RAM for machine's first move
JMP SELE Go to SELE to make move
* PMOV MES1 CUR1 WMC
MES6 LIS H'6' "DOES NOT FLANK"
BR MES1
*
PMOV PI MWAD Wait, then update
PI MVC Initiate cursor
DCI TREE Player's board is here
LR H,DC
MES0 CLR "YOUR MOVE"
MES1 LR 0,A Identify message
PI WMC Write message
DCI BLNF
CLR
ST
CUR1 PI CURS Initiate cursor
*-*- Now X in 1, Y in 2, byte in 3 and byte # in 4
LI ISA To active pieces
AS 4 add in byte #
LR IS,A
LR A,S Active pieces
LISU PLOC
AS S Passive pieces
NS 3 Cursor on piece?
LIS H'5' "NON-EMPTY SQUARE"
BNZ MES1 Yes, write message
CLR
LR 0,A Set to 0 to count
DCI PLMV Possible moves listing
OKP1 CLR
XM Get byte from PLMV
BZ MES6 Non-flanking square
DS 0 Count entry
NS 3 Does it contain bit in 3?
LM Get byte #
BZ OKP1 Try again (testing byte)
XS 4 Does # match?
BNZ OKP1 Try again (testing #)
LR A,0
COM Convert to + # for
DCI BKMV book move counter and
ST save for reply select
DCI PLAY Save data for SELE
LR A,3 BYTE
ST
LR A,4 Byte #
ST
PI MWAD Do WAIT then UPDATE
PI MVC Turn off cursor
PI ENIN Enable interrupt
DCI TREE
LR H,DC
JMP SELE
*-*-*- Message writing, uses R0, 1, SC O'24'
* calls UPDATE routine. Message # in 0.
WMC LR K,P SAVE RETURN ADDRESS
PI PUSH PUSH ONTO STACK
DCI H'872'
LI H'82'
ST TURN MESSAGE OBJECT OFF...
DCI HSAV
LR A,HU
ST
LR A,HL
ST
PI MWAD WAIT, THEN UPDATE
DCI WMCA DCO TO MESSAGE ADDRESS START
LR A,0 GET MESSAGE NUMBER
SL 1
AS 0
ADC ADD 3XNUMBER TO DCO
LISU 2
LISL 4 SET ISAR TO O'24'
LM
LR S,A SET MESSAGE LENGTH
LM
LR QU,A
LM
LR QL,A MESSAGE ADDRESS INTO Q
DCI LINE
LIS H'5'
SL 4
ST SET PROPER LINE NUMBER
DCI H'0E5F' DCO TO MESSAGE BUILD AREA
LIS H'7'
SL 4
LR 1,A SET COUNTER
CLR CLEAR ACC
WMC1 ST
DS 1
BNZ WMC1 CLEAR TEXT AREA
PI WAUD WAIT, THEN DO UPDATE
DCI H'872'
LIS H'2'
ST TURN OBJECT ON
LR DC,Q SET ADDRESS INTO DCO
PI WMS WRITE MESSAGE
PI MWAD WAIT, THEN UPDATE
DCI HSAV
LM
LR HU,A
LM
LR HL,A
PI ENIN ENABLE INTERRUPTS ONCE MORE
PI POPS POP RETURN ADDRESS
PK AND RETURN
* WMCA DATA FOR WMC
*
WMCA DC H'9' YOUR TURN 0
DC YRMV:
DC YRMV.
DC H'1' (null message) 1
DC MYMV:
DC MYMV.
DC H'10' YOU CAN NOT PLAY 2
DC NONO:
DC NONO.
DC H'E' I CAN NOT PLAY 3
DC YOUP:
DC YOUP.
DC H'B' IT IS A TIE 4
DC TIE:
DC TIE.
DC H'10' NON-EMPTY SQUARE 5
DC NOTE:
DC NOTE.
DC H'E' DOES NOT FLANK 6
DC NOTF:
DC NOTF.
DC H'6' I WIN 7
DC IWIN:
DC IWIN.
DC H'8' YOU WIN 8
DC UWIN:
DC UWIN.
YRMV DC H'0513' YOur turn
DC H'0309' UR
MYMV DC H'0' -
DC H'0703' TU
DC H'092B' RN
NOTE DC H'2B13' NOn-empty
DC H'2B1C' N-
DC H'0B29' EM
DC H'2507' PT
DC H'0500' Y-
DC H'210F' SQ
DC H'0311' UA
DC H'090B' R3
NOTF DC H'1F13' DOes not flank
DC H'0B21' ES
DC H'00' -
DC H'2B13' NO
DC H'0700' T-
DC H'1D27' FL
DC H'112B' AN
DC H'15' K
NONO DC H'0513' YOu can not play
DC H'0300' U-
DC H'3111' CA
DC H'2B00' N-
DC H'2B13' NO
DC H'0700' T-
DC H'2527' PL
DC H'1105' AY
YOUP DC H'0100' I can not play
DC H'3111' CA
DC H'2B00' N-
DC H'2B13' NO
DC H'0700' T-
DC H'2527' PL
DC H'1105' AY
TIE DC H'0107' IT is a tie
DC H'00' -
DC H'0121' IS
DC H'00' -
DC H'1100' A-
DC H'0701' TI
DC H'0B' E
IWIN DC H'0100' I win
DC H'0D01' WI
DC H'2B00' N-
UWIN DC H'0513' YOu win
DC H'0300' U-
DC H'0D01' WI
DC H'2B00' N-
*-*-*- Read keyboard
RKB LR K,P Read keyboard
PI PUSH
LISU 2
LISL 4 SET ISAR FOR DELAY TIMER
LIS H'0'
LR S,A SET FOR MAX DELAY
RKB1 PI FCS FETCH CHARACTER
BZ RKB1 NULL INPUT?
BM RKB1 NO. DEBOUNCED INPUT?
PI POPS YES. POP RETURN ADDRESS
LR A,8 GET KEYBOARD INPUT
PK AND RETURN
*-*-*- Initial plays for first player
* Caps for initial pieces, l.c. for possible plays
* |---|---|---|---| |---|---|---|---|
FSTP DC H'08' | | | x | | | | | o | |
DC H'2' byte 2 |---|---|---|---| |---|---|---|---|
DC H'04' | | X | O | x | | | O | X | o |
DC H'3' byte 3 |---|---|---|---| |---|---|---|---|
DC H'20' | x | O | X | | | o | X | O | |
DC H'4' byte 4 |---|---|---|---| |---|---|---|---|
DC H'10' | | x | | | | | o | | |
DC H'5' byte 5 |---|---|---|---| |---|---|---|---|
DC H'00' Player first Machine first
* Player always plays X
SNDP DC H'04' To 08,2
DC H'2'
DC H'04' Prefered play repeated
DC H'2'
DC H'10'
DC H'2'
DC H'04'
DC H'4'
*
DC H'10' To 04,3
DC H'2'
DC H'04'
DC H'2'
DC H'04' Prefered play repeated
DC H'2'
DC H'04'
DC H'4'
*
DC H'20' To 20,4
DC H'3'
DC H'20'
DC H'5'
DC H'20' Prefered play repeated
DC H'5'
DC H'08'
DC H'5'
*
DC H'20' To 10,5
DC H'3'
DC H'20'
DC H'5'
DC H'20' Prefered play repeated
DC H'5'
DC H'08'
DC H'5'
* BORD MEN Generate board image and introduce men
BORD LR K,P
DCI OBJ0 Do OBJ0 first
LIS H'2'
LR 2,A 2 objects
LIS H'6' OBJ0 has 6 rows
BRD1 LR 0,A
BRD2 LIS H'9' 9 lines in body of squares
BRD3 LR 1,A
BRD4 LIS H'8' 8 squares with right vertical
LR 4,A
LIS H'1' empty except for right vertical
BRD5 ST
DS 4
BNZ BRD5 Another square
DS 1
BNZ BRD4 Now the next line
LIS H'8' and 8 squares with
LR 4,A
CLR
COM Horizontal line
BRD6 ST
DS 4
BNZ BRD6
DS 0
BNZ BRD2 Now the next row of squares
DS 2
BZ MEN
DCI OBJ1 Now fix OBJ1
LIS H'2' with 2 rows
BR BRD1
*-*-*- Now put pieces in image
MEN LISU 3 Active pieces are here
LISL 0
LR A,7 Their color
LR 4,A put here
LIS H'1'
LR 0,A 1 for active, 0 for passive
MEN1 LIS H'7' To count rows
LR 1,A
MEN2 LIS H'7' To count sqwares
LR 2,A
DCI TAB1
LR A,1
SL 1 Table has 2 bytes per entry
ADC
LM Get Image row start
LR QU,A
LM
LR QL,A
CLR
AS I
BZ MEN7
LR 3,A
MEN3 NI H'1'
BZ MEN6
LR A,2
LR DC,Q
ADC Add in row start
XDC Save
DCI BLKP Anticipate a black piece
CLR
AS 4
BZ MEN4
DCI BLUP No it is to be white
MEN4 LIS H'7' Use 7 lines for piece
LR 5,A
MEN5 LM
XDC
ST
LIS H'7'
ADC
XDC
DS 5
BNZ MEN5
MEN6 LR A,3
SR 1
LR 3,A
BZ MEN7
DS 2
BP MEN3
MEN7 DS 1
BP MEN2
LR A,4
COM
LR 4,A
LISU PLOC
DS 0
BP MEN1
PK
TAB1 DC H'0F68' Image row starts
DC H'0F18' (second line in squares)
DC H'0DC8'
DC H'0D78'
DC H'0D28'
DC H'0CD8'
DC H'0C88'
DC H'0C38'
* BLKP BLUP WAST BDAT SEDC TABL
BLKP DC B'00111001'
DC B'01000101'
DC B'01000101'
DC B'01000101'
DC B'01000101'
DC B'01000101'
BLUP DC B'00111001'
DC B'01111101'
DC B'01111101'
DC B'01111101'
DC B'01111101'
DC B'01111101'
DC B'00111001'
WAST LR K,P Delay loop to WASTE some time
WAS2 LIS H'F'
LR 1,A
WAS3 CLR
LR 2,A
WAS4 DS 2
BNZ WAS4
DS 1
BNZ WAS3
PK
* UPDATE CONTROL DATA *
*
BDAT DC H'1' FLAG SET SHORT UPDATE
DC UDIT:
DC UDIT.
DC UDIT:
DC UDIT.
* Set message length and line pointer
SEDC DCI LINE DCO TO LINE POINTER
LIS H'2'
SL 4 SET FOR SECOND LINE
ST
LR A,0
SL 4
LISL 4
LR S,A AND SET MESSAGE LENGTH
CLR CLEAR ACC
LR 1,A AND SET DEFAULT RESULT
POP AND RETURN
*-*-*- Address table for MVC*
TABL DC H'0C30'
DC H'0C80'
DC H'0CD0'
DC H'0D20'
DC H'0D70'
DC H'0DC0'
DC H'0F10'
DC H'0F60'
* CURS
*-*-*- To move cursor, uses
*SC0,1,2,3,4,HU,Q,K,W, SC20-24.
CURS LR K,P
PI PUSH AND PUSH IT ON TO STACK
MAP0 PI MWAD WAIT, THEN UPDATE
LIS H'1' CAN START JOYREAD
LR HU,A SET FOR HORIZONTAL POT
PI JOYI AND READ
LR VX,A SAVE RESULT IN VX
LIS H'0'
LR HU,A SET FOR VERTICAL POT
PI JOYI
LR 0,A SAVE IN REG 0
PI AMAP CONVERT TO PROPER VELOCITY
LR VY,A SAVE RESULT
LR A,VX
LR 0,A NOW GET UNCOVERTED VX INTO R0
PI AMAP CONVERT IT
LR VX,A AND SAVE IT
PI MWAD WAIT, THEN UPDATE
PI BLNK To blink code (on)
LIS H'4'
LR 0,A
MP01 PI MWAD A second wait
DS 0
BNZ MP01
PI BLNK To blink code (off)
CLR CLEAR ACC
XS VX VX IN W/STATUS
BZ MAP7 NON-NULL X COMPONENT?
DCI XPOS YES
LM
LR X,A SET CURRENT X POSITION
LISU 2
LISL 0
CLR
LR I,A SP20<=0
LM
LR I,A SP21<=NON NULL LEAD MASK
LM
LR S,A SP22<=TRAILING MASK
CLR
XS VX VX IN W/STATUS
BM MAP3 GOING LEFT?
PI SHR SHIFT RIGHT ONE
LIS H'7' NO, GOING RIGHT.
XS X
BNZ MAP5 IN RH MOST BOX?
LISL 2 YES
XS S
BZ MAP5 TRIED TO GO TOO FAR?
MAP2 CLR YES.
LR VX,A CLEAR X VELOCITY
BR MAP7 AND CHECK Y
MAP3 PI SHL SHIFT LEFT ONE
CLR
XS X
BNZ MAP4 IN LH MOST BOX?
LISL 0 YES
XS S
BNZ MAP2 TRIED TO GO TOO FAR?
MAP4 LISL 0
CLR
XS S
BZ MAP7 IS SP20 NULL?
LISL 1 NO.
LR A,I
LR S,A
LISL 0
LR A,I
LR D,A
CLR
LR S,A SP22<=SP21,SP21<=SP20,SP20<=0,THAT ORDER
DS X AND DECREMENT X COUNT
BR MAP7 NOW GO CHECK Y
MAP5 LISL 1
CLR CLEAR ACC
XS S
BNZ MAP7 IS SP21=0?
LISL 2
LR A,D
LR I,A
CLR
LR D,A SP21<=SP22,SP22<=0, THAT ORDER
LIS H'1'
AS X
LR X,A INCREMENT X COUNT
MAP7 CLR
XS VY
BZ MAP9 VY=0?
DCI YPOS NO, SET DCO TO LAST Y POSITION
AM UPDATE Y COORD
BM MP7A Result Y is neg?
CI MAXY COMPARE W/MAX ALLOWED Y
BC MAP8 NEW Y>MAX ALLOWED VALUE?
MP7A CLR YES
LR VY,A RESET VY
BR MAP9
MAP8 LR Y,A SET NEW Y
MAP9 LR A,VY GET VY
SL 1
XS VX
BZ MP12 ANY MOVEMENT?
PI MVC YES, REMOVE OLD POSITION
CLR
XS VY
BZ MP10 ANY Y MOVEMENT?IF NOT, MUST HAVE VX NE 0
DCI YPOS
LR A,Y IS, SO RESET
ST Y POSITION
CLR
XS VX
BZ MP11 ANY X MOVEMENT?
MP10 DCI XPOS UPDATE X POSIT & MASK
LR A,X
ST
LISL 1
LR A,I
ST
LR A,S
ST
MP11 PI MVC DISPLAY NEW POSITION
MP12 CLR
OUTS 1 Clear port 1
NOP 3 NOP's for FCC
NOP Do not remove
NOP for any reason
INS 1 Get buttons
NI H'1' Strip to desired one
DCI BFLG To button flag
CLR
BNZ MP13 Any button input?
ST No, reset edge flag
MP14 JMP MAP0 And go try again
MP13 LR Q,DC Save address
XM Flag in W/STATUS
BNZ MP14 Previous input?
LIS H'1' No, reset flag
LR DC,Q Recover address
ST And reset
CON CLR
LR 0,A Set counter (Y conversion)
CON1 LR A,Y Get Y coordinate
CI YTST Compare W/test value
BC CON2 Y LE test value?
LR A,0 No, increment counter
INC
LR 0,A
LI -H'A'
AS Y
LR Y,A Y<=Y-H'A'
BR CON1 Go back and try agian
CON2 LR A,0 Get counter
LR VY,A VY now↑(0-7):(top-bottom)
LIS H'8'
SL 4
CON3 DS X
BM CON4
SR 1
BR CON3
CON4 LR VX,A VX contains the byte
PI MWAD WAIT, THEN UPDATE
PI ENIN ENABLE INTERRUPT DRIVEN UPDATE
PI POPS POP RETURN ADDRESS
PK AND RETURN
* MVC AMAP BLNK
*-*-*- MVC Set or remove cursor
MVC LR K,P SAVE RETURN ADDRESS
DCI XPOS
LM
LR 0,A SAVE X IN R0
LISU 2
LISL 3
LM
LR I,A
LM
LR D,A LEAD IN SP23,TRAIL IN SP24
DCI YPOS
LM GET Y COORDINATE
DCI H'0C30' DCO TO OBJ0 BASE ADDRESS
ADC ADD 8 X Y COORD (W/MAX FOR Y
ADC OVER H'40', CANNOT USE "CUTE"
ADC TRICKS HERE--AND FOR SPEED,
ADC WE JUST USE STRAIGHT ADC'S).
ADC
ADC
ADC
ADC
LR A,0 GET X OFFSET
ADC AND ADD IT IN
LIS CHT
LR 0,A SET COUNT FOR TRANSFER
MVC1 LR Q,DC SAVE ADDRESS IN Q REG
LR A,QU GET HO ADDRESS
CI H'E'
BNZ MVC2 AT BOTTOM OF OBJ0
LR A,QL DEFINITELY.
CI H'F'
BC MVC2 PAST BOTTOM?
LIS H'F' YES.
LR QU,A RESET HO ADDRESS
LR DC,Q AND RESET DCO ACCORDINGLY (FOR OBJ1)
MVC2 LR A,I GET LEAD MASK BYTE
LR Q,DC SAVE DCO
XM XOR IN CURSOR
LR DC,Q RECOVER ADDRESS
ST AND RESET THAT BYTE
LR Q,DC SAVE ADDRESS AGAIN
LR A,D GET TRAILING MASK BYTE
XM XOR IN BITS
LR DC,Q RECOVER ADDRESS
ST AND RESET DATA
LIS H'6'
ADC SET TO NEXT DESTINATION
DS 0 DECREMENT COUNTER
BNZ MVC1 DONE?
PK YES, RETURN
*-*-*- AMAP Mapping joystick readings to velocities
AMAP LR A,0 GET READING
CI H'40'
BNC AMP1 VAL LE H'40'?
CLR
COM YES.
BR AMP2
AMP1 CI H'C0'
CLR
BC AMP2 VAL GT H'C0'=D'192'
LIS H'1' YES, VELOCITY = 1
AMP2 POP RETURN
*-*-*- BLNK Blinking routine
BLNK LR K,P
DCI BLNF Test BLINK flag
CLR
XM
BZ BLN4 Need to blink?
LISU 2
LISL 3
LM Yes
LR I,A Get X value
LM
LR D,A and Y value to blink
*** DCI COL0
CLR
XM
BZ BLN0 Need to reverse?
LIS H'7'
XS S
LR I,A
LIS H'7'
XS S
LR D,A
BLN0 DCI H'0C30'-H'50' DC0 TO OBJ0-H'50'
LISL 4
LIS H'5'
SL 4
BLN1 ADC Add off-set
DS S
BP BLN1 Added enough?
LR Q,DC Yes
LR A,QU Get H0 address
CI H'E'
BNZ BLN2 Need reset?
LIS H'F' Yes
LR QU,A
BLN2 LR DC,Q
LISL 3
LR A,S
ADC Add off-set
LIS H'3'
LR 0,A Set counter
BLN3 LR Q,DC
LIS H'C'
SL 4
XM
LR DC,Q
ST
LIS H'7'
ADC Next one to blink
DS 0 Decrement counter
BNZ BLN3 Done?
BLN4 PK
* INIT TY0 AMP BLNK UDIT YMF SKL
INIT DC H'30'
DC H'10' OBJ1 L.O. RP
DC H'5F' TEXT LOW ORDER ROM
DC H'2C' OBJ0 H.O.RP+COLOR
DC H'2F' OBJ1 H.O.RP+color
DC H'EE'
DC H'48' OBJ0 DELTA X ---
DC H'48' OBJ1 DELTA X---
DC H'70' TEXT OBJECT DELTA X
TY0 DC H'3C' OBJ0 DELTA Y ----
DC H'14' OBJ1 DELTA Y ---
DC H'07' TEXT OBJECT DELTA Y
DC H'0D' OBJ0-X-CO
DC H'0D' OBJ1 X-CO
DC H'1C' TEXT OBJECT X COORD
DC H'48' OBJ0 Y-VALUE L.O.A
DC H'C0' OBJ1 Y-VALUE L.O.A
DC H'26' TEXT OBJECT Y VAL LO A
DC H'00' OBJ0 Y-VALUE H.0 &X-ORDER
DC H'01' OBJ1- Y-VAL H.O.$X-ORDER
DC H'82' TEXT OBJ INITIALLY OFF
UDIT DC H'30'
DC H'10'
DC H'5F'
DC H'2C'
DC H'2F'
DC H'EE'
DC H'3C'
DC H'14'
DC H'07'
*-*-*- YMF
YMF DC H'0513' Y0
DC H'0300' U-
DC H'2527' PL
DC H'1105' AY
DC H'00' -
DC H'1D' F
DC H'0109' IR
DC H'2107' ST
DC H'00' -
DC H'35' ?
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'0500' Y-
DC H'1309' OR
DC H'00' -
DC H'2B' N
*-*-*- SKL Skill text
SKL DC H'0713' TO
DC H'00' -
DC H'2527' PL
DC H'1105' AY
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'0705' TY
DC H'250B' PE
ABE DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'112D' AB
DC H'0B00' E-
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'11' A
DC H'00' -
BETY DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'2D0B' BE
DC H'0707' TT
DC H'0500' Y-
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'2D' B
DC H'00' -
CHAS DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'3119' CH
DC H'1109' AR
DC H'2701' LI
DC H'0B00' E-
DC H'00' -
DC H'00' -
DC H'31' C
DC H'00' -
DORT DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'1F13' DO
DC H'0913' RO
DC H'0719' TH
DC H'0500' Y-
DC H'00' -
DC H'00' -
DC H'1F' D
DC H'00' -
* MWAD RASC SCRA SCRD
* MWAD Wait then update and keep the X ZOOM
* bit set properly during display maintenance
MWAD LR K,P SAVE RETURN ADDRESS
PI PUSH AND PUSH ONTO STACK
PI DAI DISABLE INTERRUPTS
PI WAIT WAIT ON APPROPRIATE LINE
DCI CMRG DCO TO PROG COPY COMREG
LI MSK MASK IN
XM TURN OFF XZOOM
DCI H'8F7' IN THE UM1 COPY
ST ONLY
PI UDAT NOW DO UPDATE
LI XZOP SET LINE FOR RESTORE XZOOM
MWD1 DCI H'8FB' DCO TO CURRENT LINE
CM COMPARE
BNZ MWD1 REACHED IT YET?
DCI CMRG YES
LM
DCI H'8F7' NOW RESET UM1 COPY
ST
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*- Interrupt enable for update
ENIN LI INHR:
OUTS H'C'
LI INHR.
OUTS H'D' SET INTERRUPT VECTOR
DCI H'8F0'
LI ULIN
ST SET INTERRUPT LINE
DCI CMRG DCO TO PROG COPY COMREG
LR Q,DC SAVE ADDRESS IN Q RES
LIS H'8'
OM
LR DC,Q
ST IN PROGRAM COPY
DCI H'8F7'
ST DITTO UM1 COPY
LIS H'1'
OUTS H'E' ENABLE SMI...
EI ENABLE CPU
LR J,W SAVE SAME STATUS
POP AND RETURN
*-*-*- Interrupt disable
DAI DI DISABLE CPU INTERRUPT
LR J,W SET J ACCORDINGLY
DCI CMRG DCO TO PROG COPY COMREG
LR Q,DC SAVE ADDRESS
LIS H'8'
COM
NM TURN OFF BIT
LR DC,Q IN THE
ST PROGRAM COPY,
DCI H'8F7'
ST AND THE UM1 COPY
CLR
OUTS H'E' NOW DISABLE SMI
POP AND RETURN
*-*-*- RASC RAM to SC transfer
RASC LR K,P RAM to SC
LISU ALOC SC buffer with Active
LISL 0
RAS2 LM
LR I,A
BR7 RAS2
LM
LR I,A
LISU PLOC
RAS3 LM
LR I,A
BR7 RAS3
LM
LR I,A
PK
* SCRA SC to RAM with side reversal
SCRA LR K,P SC to RAM for side reversal
LISU PLOC
LISL 0
SCR1 LR A,I
ST
BR7 SCR1
LR A,I
ST
LISU ALOC
LISL 0
SCR2 LR A,I
ST
BR7 SCR2
LR A,I
ST
PK
* SCRD SC to RAM direct
SCRD LR K,P SC to RAM for side reversal
LISU ALOC
LISL 0
SCD1 LR A,I
ST
BR7 SCD1
LR A,I
ST
LISU PLOC
LISL 0
SCD2 LR A,I
ST
BR7 SCD2
LR A,I
ST
PK
* INHR
* Interrupt handler, saves and restores data
INHR LR 8,A SAVE ACC
LR A,IS
LISU 6
LISL 0
LR I,A SAVE ISAR IN REG O'60'
LR A,HU
LR I,A SAVE HU IN REG O'61'
LR A,HL
LR I,A SAVE HL IN REG O'62'
LR A,J
LR I,A SAVE J REG IN REG O'63'
LR H,DC SAVE OLD DCO
DCI RGSV DCO TO SAVE AREA START
LR A,HU
ST
LR A,HL
ST SAVE OLD DCO IN RGSV,RGSV+1
XDC
LR H,DC
XDC
LR A,HU
ST
LR A,HL
ST SAVE OLD DC1 IN RGSV+2,RGSV+3
LR A,KU
ST
LR A,KL
ST SAVE K REG IN RGSV+4,RGSV+5
LR K,P PC1 INTO K REGISTER
LR A,KU
ST
LR A,KL
ST PC1 INTO RGSV+6,RGSV+7
LR J,W SAVE OLD STATUS
LISU 2
LISL 3
INH2 LR A,D
ST SP23,22,21,20 IN, RESP.
BR7 INH2 RGSV+8,+9,+A,+B
DCI CMRG DCO TO COMMAND REGISTER
LI MSK MASK ON
XM TURN OFF X ZOOM BIT
DCI H'8F7' IN THE UM1
ST COMMAND REGISTER
PI UDAT UPDATE UM1 DISPLAY REGISTERS
LI XZOP SET LINE FOR XZOOM ON
INH1 DCI H'8FB' DCO TO CURRENT Y LO
CM COMPARE
BNZ INH1 DIFFERENT?
DCI CMRG NO. RESTORE X ZOOM
LM FROM OLD COPY
DCI H'8F7' TO THE UM1 COPY
ST
*
* RESTORE ALL REGISTERS
*
DCI RGSV DCO TO SAVE AREA
LM
LR HU,A
LM
LR HL,A OLD DCO TO H REG
XDC
LR DC,H NOW INTO DCO
XDC AND INTO DC1
LM
LR HU,A
LM
LR HL,A OLD DC1 INTO H REGISTER
LIS H'2'
ADC BYPASS K FOR A MOMENT
LM
LR KU,A
LM
LR KL,A
LR P,K RESTORE PC1
LISU 2
LISL 3
INH3 LM RESTORE SP20-23 FROM
LR D,A RGSV+8,+9,+A,+B
BR7 INH3
DCI RGSV+4
LM
LR KU,A
LM
LR KL,A RESTORE K REGISTER
LR DC,H RESTORE DC1
XDC AND SET DCO&DC1 PROPERLY
LR W,J NOW RESTORE STATUS AT ENTRY
*
* NOW RESTORE J,H,A FROM SCRATCH PAD
*
LISU 6
LISL 3
LR A,D GET J
LR J,A
LR A,D GET HL
LR HL,A
LR A,D
LR HU,A RESTORE HU
LR A,D GET ISAR
LR IS,A RESTORE ISAR
LR A,8 RESTORE A
EI INT. ENABLE
POP
* STOP at end of game
STOP LISU ALOC
ST2 LISL 7
CLR
LR SN,A
ST3 CLR
AS D
BZ ST5
ST4 LR 1,A Count them
DS SN
CLR
COM
AS 1
NS 1
BNZ ST4
ST5 BR7 ST3
LR A,SN
COM
INC
LR 4,A Save player's score
LR A,SN
AI H'40'
LR 5,A and machine's score
LR DC,H
PI RASC
PI BORD
LR A,SN
AI H'20'
BZ ST5A Tie case
BM ST6 You win
LR A,4 Reverse scores for machine win
LR 0,A
LR A,5
LR 4,A
LR A,0
LR 5,A
LIS H'7' "I WIN "
BR ST7
ST5A LIS H'4' "IT'S A TIE GAME
BR ST7
ST6 LIS H'8' "YOU WIN "
ST7 LR 0,A
PI WMC Write message
PI MWAD Wait then update
LR A,0
CI H'6'
BP ST10 No score to report
WSC1 CLR
LR 2,A The ten digit
LR A,4
WSC2 CI H'9'
BP WSC3 Less than 10
AI H'F6' Subtract 10
DS 2 Accumulate ten's
BR WSC2
WSC3 LR 4,A
LR A,2
COM
INC
BZ WSC4 No ten digit
LR TEMP,A
PI WDG Write ten digit
WSC4 LR A,4
LR TEMP,A
PI WDG Write unit digit
PI MWAD
CLR
AS 5
BZ WSC5 Both numbers reported
LR 4,A
CLR
LR 5,A Set to 0 for exit
LI H'1C' Introduce a -
LR TEMP,A
PI WC
BR WSC1
WSC5 PI MWAD Wait then update
ST10 PI ENIN Enable interrupts
LIS H'7'
SL 4
LR 3,A
STO3 PI WAST Leave message up awhile
DS 3
BNZ STO3
STO4 PI MWAD Do wait, then update
DCI H'872'
LI H'82'
ST TURN MESSAGE OFF
LR A,0 Get message type
LR 6,A And save in REG 6
ZS0 LIS H'D'
LR 1,A Set NOTE COUNT (14 NOTES)
ZS1 LIS H'7' Set mask
XS 6
DCI TUN2 Default tune--for Player win
BNZ ZS2 Computer wins?
DCI TUN1 Yes, set tune accordingly
ZS2 LR A,1 Get current NOTE COUNT
SL 1
AS 1 Mult by three for proper offset
ADC And add it in
LISU 4
LISL 4
LM Get DELTA LINE count
LR D,A Into SP44
LM
LR S,A Get LEVEL into SP43
LM And get DURATION into
LR 5,A REG 5
PI SNE Enable sound
ZS3 PI WAUD And wait
DS 5 Decrement DURATION
BNZ ZS3 Done with NOTE?
DS 1 Yes, decrement NOTE COUNT
BP ZS1 Done all of SONG?
LIS H'A' YES
SL 4
LR 1,A Set counter
ZS4 PI MWAD Delay
DS 1 For approximately
BNZ ZS4 2.7 Seconds
JMP H'4000' And return to RESIDENT
* FLSH
FLSH DCI PNUM DCO to play number
LIS H'2'
CM
BC FLS5 PAST BOOK MOVES?
PI BORD NO, JUST DISPLAY BOARD
FLS6 JMP PMOV AND GO PLAYERS MOVE
FLS5 PI MWAD WAIT, THEN UPDATE
DCI H'872' DISABLING INT. AT SAME TIME
LI H'82'
ST TURN OFF MESSAGE OBJECT
LISU 4
LISL 4
LIS H'3'
SL 4
LR D,A SET DELTA LINE
LIS H'3'
LR S,A SET LEVEL
PI SNE ENABLE SOUND
LIS H'F'
LR 6,A SET DURATION
FLS1 PI WAUD WAIT, THEN UPDATE
DS 6
BNZ FLS1 BEEPED LONG ENOUGH?
PI DAI YES, DISABLE SOUND
LIS H'5'
LR 6,A SET BLINK COUNT
FLS2 DCI TRE2
PI RASC GET BOARD AFTER PLAYER MOVE
PI WAUD NOW DO UPDATE
PI ENIN
LR A,7
COM
LR 7,A
PI BORD DISPLAY BOARD
LR A,7
COM
LR 7,A
LIS H'2'
SL 4
LR 3,A SET COUNTER
FLS3 PI MWAD WAIT A BIT
DS 3
BNZ FLS3
DCI TREE
PI RASC BOARD AFTER MACHINE MOVE
PI ENIN
PI BORD DISPLAYED
LIS H'2'
LR 3,A
FLS4 PI MWAD WAIT A MOMENT
DS 3
BNZ FLS4
DS 6
BNZ FLS2 DONE ENOUGH TIMES?
DCI PLMV Players moves found?
CLR
XM
BNZ FLS6 Yes, go to PMOV
LIS H'2' Machine to play again
LR 0,A
PI WMC
PI WAST
CLR
INC
LR 0,A
PI WMC
CLR
INC
SL 4
AS HL
LR DC,H
DCI TRE2
LR H,DC
LR A,7
COM
LR 7,A
JMP FIND Find another machine play
* SELE FLIP FORE
SELE PI SEE
LR A,HL
SR 4
SL 1
DCI PLAY-2
ADC
LR Q,DC
LM
LR 0,A
LM
LR BN,A
CLR
AS 0
BNZ SEL3
JMP NEXT
SEL3 CLR
COM
AS 0
NS 0
LR DC,Q
ST Return byte with 1 bit removed
XS 0 Get byte with selected bit on
LR BY,A
DCI ESAV
ST Save for repeated use
LI ISA
AS BN
LR IS,A Location to add bit
LR A,S
AS BY
LR S,A New piece added
LIS H'E' Start here and then DS
LR DR,A 8 directions, 2 bytes per entry
DCI SFLG
CLR
COM
ST
SEL4 PI MSUB Returns values in DR and CV
CLR with bit on in BY if string
XS BY is found in this direction
BZ SEL5 No flanked string found
DS CV decrease count for termination
FLIP LR A,CV
LR 0,A
CLR
FLP2 AS FB
DS 0
BNZ FLP2 Aaccumulate byte shift
AS BN Add in initial position
AI ISA this all for where active
LR IS,A piece will appear
LR A,CV
LR 0,A
* Shift in the reverse direction to that used in MSUB
CLR
XS RL Is abit shift required?
DCI ESAV
LM Get prepared with bit
BZ FLP5 No
BM FLP4 Which direction?
FLP3 SL 1
DS 0
BNZ FLP3 Accumulate necessary SL's
BR FLP5
FLP4 SR 1
DS 0
BNZ FLP4 Accumulate necessary SR's
FLP5 LR BY,A Save for use with passive
XS S Introduce active piece
LR S,A and save
LISU PLOC
LR A,BY
XS S Remove passive piece
LR S,A and save
DS CV Back up 1 along string
BNZ FLIP Still another piece to flip
SEL5 DS DR Next direction?
DS DR
BP SEL4 Yes
* All flippable strings flipped
* FORE
FORE PI SEE
LR A,HL
SL 4
CI H'2' Where are we?
BP FOR5 Player's or first machine's play
CI H'D' Out of space?
DCI DNUM-2 Prepare for depth checking
ADC
LR Q,DC
LM
LR 0,A
BZ FOR3 Yes, out of space
XDC
DCI PLY0
CM At PLY0?
BZ FOR3 Yes
DCI PNUM
AM
CI H'40' At 64th play?
BNZ FOR4 No
FOR2 JMP EVAZ To piece eval only
FOR3 DCI PNUM
AM
CI H'40'
BZ FOR2
JMP EVAL To normal EVAL
FOR4 LR A,7 Normal advance
COM
LR 7,A
LR DC,Q Get DNUM back
LM
INC Increment and advance it
ST
LIS H'1'
SL 4
AS HL
LR HL,A
SR 4
DCI SCOR-3 Score back 2 (+ offset)
ADC
LM
CM Only to index
ST Advance score by 2
LR DC,H
PI SCRA
JMP FIND
FOR5 BZ FOR7 Machine's first play
PI BORD Show board after players move
DCI DNUM
CLR
ST
INC
ST
LIS H'1'
LR 0,A
PI WMC Clear brow wrinkling area
DCI SCOR Preset score
LI H'C1'
ST
ST
ST
DCI PNUM
LR Q,DC
LM
INC Add 1 to play count
LR DC,Q
ST
CI H'40'
BNZ FOR6
JMP STOP Stop after player's play
FOR6 CI H'1'
BNZ FOR4 OK to go forward
LR A,7
COM
LR 7,A
DCI TRE2
LR H,DC
PI SCRA
* Machine to make 2nd move from book
LISU 2 Get random number
LISL 5
LIS H'3'
NS S 0 to 3 random number
LR 0,A
DCI BKMV Get stored move munber
LM
SL 1 Make room for random selection
SL 1
AS 0 Random choice between them
SL 1 2 bytes per entry
DCI SNDP Stored table of book replies
ADC
LM Get reply byte
LR BY,A
LM and the byte #
LR BN,A
DCI PLAY+2
LR A,BY
ST
LR A,BN
ST
LR DC,H
PI RASC RA to SC as required by SELE
JMP SELE
FOR7 DCI DNUM
CLR
ST
DCI PNUM
LR Q,DC
LM
CI H'1' Did we come from a book move?
BM FOR8 No
INC Yes, increment PNUM
LR DC,Q
ST
LR A,7 Change sides
COM
LR 7,A
DCI TREE Back to player's board
LR H,DC
PI SCRA
JMP FIND To find possible player's plays
FOR8 CI H'3F' Is this the last play?
BNZ FOR9 No, so go forward
JMP STOP Stop on machine's play
FOR9 JMP FOR4
* MSUB Subroutine to locate all plays in specified byte
MSUB LR K,P
MS2 LR A,DR
DCI MTAB
ADC
LM
LR RL,A R or L info
LM
LR FB,A F or B info
DCI ESAV Recall starting byte
LM
LR BY,A
LIS H'1' Single R or L and single
LR CV,A F or B to start
MS4 LR A,CV Loop begins here
LR 0,A
CLR
MS5 AS FB
DS 0
BNZ MS5 Accumulate byte shifts
AS BN Starting byte
BM MS9 Woops too far
CI H'7'
BM MS9 Woops again
AI ISP Looking at passive pieces
LR IS,A Location of passive byte to consider
LR A,CV
LR 0,A Reset counter
CLR
XS RL Set status from RL
LR A,S And get passive byte
BZ MS8 No shift required
BM MS7 Left shifts called for
MS6 SR 1 Right shifts called for
DS 0
BNZ MS6 Accumulate shifts
BR MS8
MS7 SL 1 Do the left shifts
DS 0
BNZ MS7 Accumulate shifts
MS8 NS BY
LR BY,A
BNZ MS10 Still a string
MS9 DS DR Any more directions?
DS DR Remember, 2 bytes per entry
BP MS2 Try next direction
PK Zero return in A
MS10 LR A,CV
INC Add to count along string
LR CV,A
LR 0,A
CLR
MS11 AS FB Now look for Active termination
DS 0 Accumulate the F's or B's
BNZ MS11
AS BN Add in initial byte number
BM MS9 Out of range
CI H'7'
BM MS9 Out of range
AI ISA and the Active start
LR IS,A
LR A,CV
LR 0,A Reset counter
CLR
AS RL Only to Set status for R or L
LR A,S
BZ MS14 No shifts needed
BM MS10 Left shifts called for
MS12 SR 1 Shift right
DS 0
BNZ MS12 Accumulate shifts
BR MS14
MS13 SL 1 Shift left
DS 0
BNZ MS13 accumulate shifts
MS14 NS BY And to the surviving bits
BZ MS4 Maybe a continuing string
LR 0,A Save temporarily
DCI SFLG SELE or FIND source?
CLR
XM
BZ MS15 From FIND
LR A,0
LR BY,A
PK A flanked string found
MS15 LR A,HL
SR 4
SL 1
DCI PLAY-2
ADC
LR Q,DC
LR A,0
OM
LR DC,Q
ST
JMP MS4
* NEXT PFND FIND
NEXT PI SEE
CLR
COM -1 indicated NEXT entry
LR BN,A Use BN as temporary flag
BR FN1
PFND LR DC,H
PI RASC
CLR
LR BN,A Start at 0 for PFND
INC
BR FN1
FIND PI SEE
LR DC,H
PI RASC Get data into SC
CLR 0 indicates initial FIND
LR BN,A Start at 0 for FIND
FN1 DCI FFLG Flag
ST
LR A,HL
SR 4
SL 1
DCI PLAY-2
ADC
LR Q,DC Later used to store byte
CLR
ST Set byte to 0
XS BN From NEXT?
BZ FN2 No
LM Get last used byte #
BR FN5A and index it
FN2 LR BN,A The starting byte #
LI ISA Active pieces
AS BN Initial byte off-set
LR IS,A The active byte to start
LR A,S and the byte of active pieces
LISU PLOC
AS S Add in the passive pieces
COM
BZ FN5 No empty squares in this row
DCI ESAV Save for future use
ST The empty squares in starting byte
LIS H'E' 8 double-byte entries
LR DR,A The direction under investigation
DCI SFLG
CLR
ST
FN3 PI MSUB Locate a string
LR A,HL
SR 4
SL 1
DCI PLAY-2
ADC
CLR
LM
BZ FN5 No string found
LR A,BN
ST Store byte #
LR A,HL
CI H'10' Player's board?
BZ FN4 Yes
JMP SELE No, so go ahead
FN4 XDC
DCI PLMV
FN4A LR Q,DC
CLR
AM
BNZ FN4A Find empty location
LR DC,Q
XDC
LM Move data from PLAY
XDC
ST to PLMV
XDC
LM
XDC ST
LR A,HL
SR 4
SL 1
DCI PLAY-2
ADC
CLR
ST Set back to 0 for next row
FN5 LR A,BN No strings from this row
FN5A INC
LR BN,A
CI H'8'
BNZ FN2 Try the next row
LR A,HL
CI H'10'
BNZ FN6
JMP FLSH Report machine's play
FN6 DCI FFLG
CLR
LM
BP FN7
JMP AFT From NEXT so back up
FN7 LR A,HL
CI H'20'
BZ FN10 Must tell player to play again
FN8 DCI PLAY-2 Let other side play again
LR A,HL after fixing PLAY
SR 4
SL 1
ADC
CLR
ST Store a null byte
LIS H'7'
ST and 7 as the byte #
LR A,7
COM
LR 7,A
LR A,HL
SR 4
AI -H'1'
DCI DNUM Also fix DNUM
ADC
LR Q,DC
CLR
COM Set back for passed board
AM
LR DC,Q
ST
ST Advance DNUM without incrementing
LR A,7 Reverse sides
COM
LR 7,A
LIS H'1' Advancs HL
SL 4
AS HL
LR HL,A
SR 4
DCI SCOR-3 Advance score
ADC
LM
CI H'CA'
CM To index only
BM FN9
INC
FN9 ST
LR DC,H
BR FN11
FN10 LIS H'3' "I CAN NOT PLAY"
LR 0,A
PI WMC
LR A,7
COM
LR 7,A
DCI TREE
LR H,DC
FN11 PI SCRA
JMP FIND
* Table defining R or L shift and F or B direction
MTAB DC H'FF' LB
DC H'FF'
DC H'FF' LL
DC H'0'
DC H'FF' LF
DC H'1'
DC H'0' BB
DC H'FF'
DC H'0' FF
DC H'1'
DC H'1' RB
DC H'FF'
DC H'1' RR
DC H'0'
DC H'1' RF
DC H'1'
* AFT No more plays found so time to back up
AFT PI SEE
LR A,HL Prepare to back up
SR 4
CI H'2'
BNZ AFT0 Not at end of tree search
*Prepare for verification of player's reply
DCI TREE
LR H,DC BACK TO PLAYER'S BOARD
LR A,7
COM Reverse sides
LR 7,A
AFTB DCI PNUM Entry after book move
LR Q,DC
LM
INC
LR DC,Q
ST
AFTZ DCI PLMV This space is overwritten
CLR Clear first byte
ST
JMP PFND Get verification info for play
AFT0 DCI SCOR-1 SCOR reference
ADC
LR Q,DC
LM
LR SN,A The score # for current board
AFTE LR A,HL Entry from EVAL
CI H'30'
BZ AFT1 No room to prune
LR DC,Q
LIS H'1'
COM
ADC
LR A,SN
CM
BM AFT2
LIS H'E' Back 2 levels
BR AFT4
AFT1 CLR
COM Now consider previous level
LR DC,Q
ADC
LR Q,DC We may need to save score
AFT2 LR A,SN
COM
INC
LR SN,A
CM
BP AFT3 Do not back score
LR DC,Q Back score
ST
LR A,HL
CI H'30'
BNZ AFT3
LR DC,H
XDC
DCI TREE
LISU 2
LISL 0
LIS H'1'
SL 4 Fast H'10'
LR S,A
PI TRAN Save board
AFT3 LR A,7 Reverse sides and back 1 level
COM
LR 7,A
LIS H'F' Back 1 level
AFT4 SL 4 Fast H'F0' or H'E0'
AS HL
LR HL,A
LR DC,H
PI RASC
JMP SELE
EV6VAZ EVAL
EVAZ CLR
COM
BR EV1
EVAL PI SEE
CLR
EV1 LR CV,A
CLR
LR SN,A To accumulate score
INC
LR DR,A To index to ISP
LI ISA Active pieces first
EV2 LIS H'7'
LR BN,A To index bytes
EV3 CLR
AS I
BZ EV9
LR BY,A Save byte
CLR
AS CV
BNZ EV8 No positional credit in this case
AS BN
BZ EV4
CI H'7'
BNZ EV5
EV4 DCI MSK2 Rows 0 and 7 H'A5'
PI CSUB
DCI MSK3 Rowa 0 and 7 H'BD'
PI CSUB
DCI MSK1 Rows 0 and 7 H'81'
PI CSUB
EV5 LR A,BN
CI H'1'
BZ EV6
CI H'6'
BZ EV8
PI CSUB All rows except 1 and 6 H'81'
PI CSUB and again
DCI MSK3 All rows except 1 and 6 H'BD'
PI CSUB
EV6 LR A,BN
CI H'2'
BZ EV7
CI H'5'
BNZ EV8
EV7 DCI MSK2 Rows 2 and 5 H'A5'
PI CSUB
EV8 DCI MSK4 All rows HFF'
PI CSUB
EV9 DS BN
BP EV3
LR A,SN
COM
INC
LR SN,A
LISU PLOC
DS DR
BP EV2 Around again for Passive pieces
LR A,HL
SR 4
DCI SCOR-1
ADC
LR Q,DC
LR A,SN
CM
BP EV11
LR DC,Q
ST
EV11 JMP SELE
* Subroutine to count bits as masked
CSUB LR K,P
LM _________________________________
NS BY |_7_|_1_|_5_|_4_|_4_|_5_|_1_|_7_|
BZ CSU3 |_1_|_1_|_1_|_1_|_1_|_1_|_1_|_1_|
CSU2 DS SN |_5_|_1_|_3_|_2_|_2_|_3_|_1_|_5_|
LR FB,A |_4_|_1_|_2_|_2_|_2_|_2_|_1_|_4_|
AI H'FF' |_4_|_1_|_2_|_2_|_2_|_2_|_1_|_4_|
XS FB |_5_|_1_|_3_|_2_|_2_|_3_|_1_|_5_|
BNZ CSU2 |_1_|_1_|_1_|_1_|_1_|_1_|_1_|_1_|
CSU3 PK |_7_|_1_|_5_|_4_|_4_|_5_|_1_|_7_|
MSK1 DC H'81'
MSK2 DC H'A5' Occupancy credit
MSK3 DC H'BD'
MSK4 DC H'FF'
* SHOW ADTB SEE
SHOW LR K,P SAVE RETURN ADDRESS
PI PUSH AND PUSH ONTO STACK
DCI CMRG DCO TO PROG COPY OF COMMAND REG
LM GET SAME
DCI H'8F7' DCO TO UM1 COPY OF SAME
ST RESET UM1 FROM PROG COPY
PI BORD DISPLAY BOARD FIRST
DCI HSAV THEN DCO TO HSAVE AREA
LR A,HU
ST
LR A,HL
ST AND SAVE THE H REGISTER
SR 4 GET HO NIBBLE OF HL
SL 1 MULT BY 2 FOR INDEX INTO TABLE
DCI ADTB DCO TO CHARACTER ADDRESS TABLE
ADC ADD OFFSET FOR HL HO NIBBLE
LM
LR HU,A
LM
LR HL,A AND GET ADDRESS OF CHAR.INTO H
DCI OBJ0 DCO TO DEST START
XDC SAVE DEST IN DC1
LR DC,H SOURCE INTO DCO
LIS H'7' SET TRANSFER
LR HU,A COUNT IN HU
SH4 LM GET SOURCE BYTE
XDC NOW GET DEST. ADDRESS
ST AND STORE
LIS H'7'
ADC ADD OFFSET TO NEXT DEST.
XDC SOURCE INTO DCO, DEST IN DC1
DS HU DECREMENT COUNTER
BNZ SH4 DONE?
DCI HSAV YES
LM GET H REGISTER
LR HU,A BACK TO ITS
LM ORIGINAL
LR HL,A STATE
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*-*-*-*-*-*-*-*-*
*ADDRESS TABLE FOR *
*DIGIT CHARACTERS *
*-*-*-*-*-*-*-*-*-*-*
ADTB DC H'218A' 0 ADDRESS
DC H'210C' 1 ADDRESS
DC H'217C' 2 ADDRESS
DC H'216E' 3 ADDRESS
DC H'20FE' 4 ADDRESS
DC H'20F0' 5 ADDRESS
DC H'20E2' 6 ADDRESS
DC H'2072' 7 ADDRESS
DC H'2064' 8 ADDRESS
DC H'2056' 9 ADDRESS
DC H'2087' A ADDRESS
DC H'214B' B ADDRESS
DC H'2167' C ADDRESS
DC H'20E9' D ADDRESS
DC H'205D' E ADDRESS
DC H'20DB' F ADDRESS
*
SEE LR K,P See where it loops
DCI H'0EC0' Save data here
LIS H'3' 3 items per entry
AM
CI H'C' Is there room?
BP SEE2 Yes
CLR Start over
SEE2 DCI H'0EC0'
ST
ADC
LR A,KU Where we came from
ST
LR A,KL
ST
LR A,HL And the H value
ST
PK
* TUN2 TUN1 END
*=*=*=*=*=*=*=*=*=*
TUN2 DC H'4707'
DC H'78'
DC H'4003'
DC H'1F'
DC H'3C03'
DC H'1E'
DC H'3507'
DC H'1E'
DC H'3003'
DC H'1E'
DC H'2D03'
DC H'0F'
DC H'2D03'
DC H'0F'
DC H'2807'
DC H'5A'
DC H'3C03'
DC H'0F'
DC H'3507'
DC H'0F'
DC H'3003'
DC H'1E'
DC H'3C03'
DC H'1E'
DC H'3C03'
DC H'1E'
DC H'5007'
DC H'0F'
*=*=*=*=*=*=*=*=*=*=*
*COMPUTER WIN TUNE *
*=*=*=*=*=*=*=*=*=*=*
TUN1 DC H'2807'
DC H'2D'
DC H'2003'
DC H'0F'
DC H'1E03'
DC H'0F'
DC H'2003'
DC H'0F'
DC H'2403'
DC H'0F'
DC H'2807'
DC H'1E'
DC H'1E03'
DC H'0F'
DC H'2003'
DC H'1E'
DC H'2807'
DC H'2D'
DC H'2003'
DC H'0F'
DC H'1E03'
DC H'0F'
DC H'2003'
DC H'0F'
DC H'2807'
DC H'2D'
DC H'2003'
DC H'2D'
END END FOR ASSEMBLER
*
BRAK LR A,HL
SR 4
DCI H'0C2B'
CM
BZ BRA2
JMP SELE
BRA2 NOP
NOP
NOP
NOP
JMP SELE
* Storage map
_______________________________________________________________
Image ar|_______________________________|_______________________________|
10 |_______________________________|_______________________________|
lines |_______________________________|_______________________________|
per |_______________________________|_______________________________|
__row___|_______________________________|_______________________________|
Ply ar. | Active pieces | Passive pieces |
| 0 1 2 3 | 4 5 6 7 | 8 9 A B | C D E F |
H'0C00' | Used by RES. | | | |
H'0C10' |___________ ___|_______________|_______________|_______________|
H'0C20' |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|see below
H'0C30' | Row 1 of the | board image | | |
|_______________|______________ |_______________|_______________|
H'0C80' | Row 2 | | | |
|_______________|_______________|_______________|_______________|
H'0CD0' | Row 3 | | | |
|_______________|_______________|_______________|_______________|
H'0D20' | Row 4 | | | |
|_______________|_______________|_______________|_______________|
H'0D70' | Row 5 | | | |
|_______________|_______________|_______________|_______________|
H'0DC0' | Row 6 | | | |
|_______________|_______________|_______________|_______________|
H'0E10' | Players board | | | |
H'0E20' | PLY 0 | | | |
H'0E30' | Ply 1 | | | |
H'0E40' | Ply 2 | | _____|_______________|
H'0E50' | Ply 3 _______ |_______________|__________|PLMD+___+___+___|TX |
H'0E60' | PLY 4 H'0E5F'| thru 'H'0ECE'| | |
H'0E70' | PLY 5 |overwritten by |text display | |
H'0E80' | PLY 6 | to tell player|that it is his |move |
H'0E90' | PLY 7 | | | |
H'0EA0' | PLY 8 | | | |
H'0EB0' | PLY 9 | | | ____|
H'0EC0' | PLY 10 _______|_______________|_______________|___________|___|
H'0ED0' | PLY 11 _______|_Overwritten___|_by PLMV_______|_______________|
H'0EE0' | DNUM__________|_______________|_______________|_______________|
H'0EF0' |_PLAY__|BY_|BN_|BY_|BN_|etc|___|___|___|___|___|___|___|___|___|
H'0F00' |___|___|___|___|___|___|___|___|___|___|___|___|_XPOS______|YPO|
H'0F10' | Row 7 of the | board image | | |
|_______________|_______________|_______________|_______________|
H'0F60' | Row 8 | | | |
|_______________|_______________|_______________|_______________|
H'0FB0' |__SCOR_________|_______________|_______________|_______________|
H'0FC0' |___|RGSV interrupt save area___________________________|
_______________________________________________________
H'0C20' |_BFLG_|_BLNF_|_XBLN_|_YBLN_|_BCNT_|_BKMV_|_HSAV_|_HSAV_|
_______________________________________________________
H'0C28' |_PLY0_|_COL0_|_SELX_|_BLEV_|_AP20_|_XOLD_|_YOLD_|_CFLG_|